package com.smg.crm.settings.web.controller;

import com.smg.crm.exception.LoginException;
import com.smg.crm.settings.domain.User;
import com.smg.crm.settings.service.UserService;
import com.smg.crm.utils.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Controller
@RequestMapping("/settings/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     *
     * @param loginAct
     * @param loginPwd  未加密的密码
     * @param flag      十天免登陆的标记
     *                      业务逻辑:
     *                          如果勾选了十天免登陆操作
     *                              将用户名和密码存入到cookie中
     *                          进行自动登录的时候,就可以从cookie中获取用户名和密码,然后执行登录操作
     * @return
     */
    @RequestMapping("/login.do")
    //ModelAndView可以封装视图名称和页面需要的数据
//    public ModelAndView login(){
    //String就是页面跳转的视图名称,如果有想要封装的数据,需要注入Model的对象
    //不论是ModelAndView还是Model对象都是将数据存入到Request域中进行页面获取
    public String login(String loginAct, String loginPwd, HttpServletRequest request, String flag, HttpServletResponse response) throws LoginException {

        //登录操作
        String md5 = MD5Util.getMD5(loginPwd);
        System.out.println("未加密前的密码:"+loginPwd);
        System.out.println("加密后的密码:"+md5);
        //使用用户名和密码查询数据库是否有匹配的用户对象
        //通过request对象获取,访问的ip地址
        //获取ip地址时,不能使用localhost进行访问,因为localhost进行访问时,0:0:0:0:0:0:0:1这样的一个地址
        //现在访问登录的时候,需要将localhost本机地址替换成127.0.0.1本机地址
        String ipAddr = request.getRemoteAddr();

        System.out.println("ipAddr::"+ipAddr);

        User user = userService.login(loginAct,md5,ipAddr);

        if(user != null){
            //将user对象,存入到session中,登录操作
            //后面如果从session中获取到了这个user对象,证明已登录,如果没有获取到证明未登录.
            request.getSession().setAttribute("user",user);
        }

        //勾选了十天免登陆
        if("a".equals(flag)){
            //将用户名和密码存入到cookie中
            //该cookie中存储用户名
            Cookie loginActCookie = new Cookie("loginAct",loginAct);
            //该cookie中存储密码
            Cookie loginPwdCookie = new Cookie("loginPwd",md5);

            //设置十天免登陆的过期时间
            int MAX_AGE = 60 * 60 * 24 * 10;
            loginActCookie.setMaxAge(MAX_AGE);
            loginPwdCookie.setMaxAge(MAX_AGE);

            //设置cookie的路径
            //在任意的方法中都可以获取到该cookie
            loginActCookie.setPath("/");
            loginPwdCookie.setPath("/");

            //使用response对象,写入到浏览器中
            response.addCookie(loginActCookie);
            //大家不用担心将密码写入到cookie会不安全
            //如果说请求被获取,从cookie中提取出密码,此时的密码是是被加密的
            //即使它按照md5的加密的密码进行了输入,在后台会对登录的密码进行加密,所以说肯定不会匹配的
            response.addCookie(loginPwdCookie);
        }

        //返回的页面地址:工作台首页
        //前缀:/WEB-INF/jsp
        //返回:/workbench/index
        //后缀:.jsp
        return "/workbench/index";
    }


    /**
     * 该方法是程序的入口
     *
     * 跳转到登录页面
     *      将webapp下的login.jsp
     *      移动到了WEB-INF/jsp目录下
     *
     * 在该方法中进行免登陆的操作
     *      在访问登录页面的时候,先去进行cookie中的数据查询
     *          如果cookie中有loginAct和loginPwd,获取到然后进行登录操作
     *          如果登录成功在login方法中就能够跳转到首页面
     * @return
     */
    @RequestMapping("/toLogin.do")
    public String toLogin(HttpServletRequest request) throws LoginException {

        String loginAct = null;
        String loginPwd = null;

        System.out.println("toLogin");
        //获取cookie中的loginAct和loginPwd
        Cookie[] cookies = request.getCookies();

        if(cookies != null && cookies.length >0){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if("loginAct".equals(name)){
                    //找到了loginAct的Cookie,获取它的value属性,就是我们具体的登录名称
                    loginAct = cookie.getValue();
                    //遍历时,如果找到了数据,使用continue/break进行下一次循环或跳出循环
                    continue;
                }

                if("loginPwd".equals(name)){
                    //找到了loginPwd的Cookie,获取它的value属性,就是我们具体的登录密码
                    loginPwd = cookie.getValue();
                }
            }

            //业务逻辑判断
            if(loginAct != null && loginPwd != null){
                if(loginAct.length() > 0 && loginPwd.length() >0){

                    //如果获取到了,并且不为空
                    //进行登录操作,自动登录操作

                    User user = userService.login(loginAct, loginPwd, request.getRemoteAddr());

                    //如果user不等于空,证明登录成功
                    if(user != null){
                        //将该user对象存入到session中
                        request.getSession().setAttribute("user",user);

                        //如果登录失败,会在service方法中抛出LoginException异常,会被异常处理器捕获
                        //返回失败的结果

                        //重定向到首页面
                        //下午完成该方法进行测试
                        return "redirect:/workbench/toIndex.do";
                    }else{
                        //证明用户名或密码错误
                        //跳转到登录页面
                        return "login";
                    }

                }
            }
        }


        return "/login";
    }


    /**
     * 退出成功后,跳转到登录页面
     *      在登录的时候我们将用户对象保存到了session中
     *      退出的时候要清理掉session信息
     *      将十天免登陆的信息也清理掉
     *          清理cookie中的信息
     * @return
     */
    @RequestMapping("/logout.do")
    public String logout(HttpSession session,HttpServletRequest request,HttpServletResponse response){

        //清理session数据
        //方式1:可以删除session中的某个对象
//        session.removeAttribute("user");

        //方式2:销毁session
        session.invalidate();

        //清理cookie数据
        //获取到所有的cookie数据
        Cookie[] cookies = request.getCookies();
        //方式1:将cookie中的name对应的value给覆盖掉
//        for (Cookie cookie : cookies) {
//            String name = cookie.getName();
//            if("loginAct".equals(name)){
//                //将value属性覆盖成空的字符串
//                cookie.setValue("");
//                continue;
//            }
//            if("loginPwd".equals(name)){
//                cookie.setValue("");
//            }
//        }
        //方式2,将cookie对象进行覆盖操作
        //因为cookie是不能存储两个相同的name属性的
        Cookie cookie1 = new Cookie("loginAct","");
        Cookie cookie2 = new Cookie("loginPwd","");

        //设置过期时间
        cookie1.setMaxAge(0);
        cookie2.setMaxAge(0);

        cookie1.setPath("/");
        cookie2.setPath("/");

        //写入cookie
        response.addCookie(cookie1);
        response.addCookie(cookie2);

        //退出成功后,跳转到登录页面
        return "/login";

    }

}
